﻿using System;
using System.Collections.Generic;
using System.Linq;
using vudu.EnlaceDatos.SqlServer;

namespace vudu.Logica.Clases
{
    public class Reporte
    {
        #region Atributos clase Reporte

        private string _nombre;
        private decimal _promedioTotal;
        private SqlServerReporte _sql;

        #endregion
        
        #region Constructor

            public Reporte()
            {
                _sql = new SqlServerReporte(); 
            }

        #endregion

        #region Getters y Setters

        public string Nombre
        {
            get 
            {
                return _nombre; 
            }
            set
            {
                _nombre = value; 
            }
        }

        public decimal PromedioTotal
        {
            get 
            {
                return _promedioTotal; 
            }
            set 
            { 
                _promedioTotal = value; 
            }
        }

        #endregion

        #region Metodos de Reporte

        /// <summary>
        /// Consulta todas las materias y secciones de un profesor
        /// </summary>
        /// <returns>retorna una lista de tipo seccion materia</returns>
        public List<SeccionMateria> ConsultarMateria(int IdProfesor)
        {
            try
            {
                List<SeccionMateria> materias = new List<SeccionMateria>();
                materias = _sql.ConsultarMateriaSeccionProfesor(IdProfesor);
                return materias;
            }
            catch (NullReferenceException e)
            {
                return null;
            }
        }

        /// <summary>
        /// Consulta todas las materias y secciones de un profesor
        /// </summary>
        /// <returns>retorna una lista de tipo seccion materia</returns>
        public List<Practica> ConsultarPractica(int IdProfesor)
        {
            try
            {
                List<Practica> practicas = new List<Practica>();
                practicas = _sql.ConsultarPracticaProfesor(IdProfesor);
                return practicas;
            }
            catch (NullReferenceException e)
            {
                return null;
            }
        }

        /// <summary>
        /// Consulta Todas las notas de una seccion
        /// </summary>
        /// <returns>retorna una lista de tipo evaluacion</returns>
        public List<Evaluacion> ConsultarNotas(int IdSeccion)
        {
            List<Evaluacion> evaluaciones = new List<Evaluacion>();
            List<Evaluacion> consultaEvaluaciones = new List<Evaluacion>();
            int i = 0;
            try
            {
                evaluaciones = _sql.ConsultarEvaluacion(IdSeccion);
                int numeroRegistros = evaluaciones.Count;
                while (i < numeroRegistros)
                {
                    List<Nota> notas = new List<Nota>();
                    Evaluacion evaluacion = evaluaciones.ElementAt(i);
                    notas = _sql.ConsultarNotas(evaluacion.IdEvaluacion);
                    evaluacion.NotasEvaluacion = notas;
                    consultaEvaluaciones.Add(evaluacion);
                    i++;
                }
                return consultaEvaluaciones;
            }
            catch (NullReferenceException e)
            {
                return null;
            }
        }

        /// <summary>
        /// Se busca la lista de notas del alumno
        /// </summary>
        /// <returns>retorna una lista de tipo decimal</returns>
        public List<decimal> ConsultarNotasAlumno(int idAlumno, List<Evaluacion> evaluaciones)
        {
            List<decimal> notasAlumno = new List<decimal>();

            try
            {
                int i = 0;
                int cuenta = 0;
                int numeroRegistros = evaluaciones.Count;
                //Este ciclo recorre todas las evaluaciones de la seccion
                while (i < numeroRegistros)
                {
                    cuenta = 0;
                    Evaluacion evaluacion = evaluaciones.ElementAt(i);
                    int numeroNotas = evaluacion.NotasEvaluacion.Count;
                    String hola = evaluacion.Nombre;
                    int j = 0;
                    int validacion = 0;
                    //Este ciclo recorre cada nota de cada evaluacion
                    while (j < numeroNotas)
                    {
                        decimal notaConsultada = 0;
                        //Con este if se identifica la nota del alumno deseado en cada evaluacion
                        if ((evaluacion.NotasEvaluacion.ElementAt(j).FkIdEstudiante.Equals(idAlumno))&&(validacion==0))
                        {
                            notaConsultada = evaluacion.NotasEvaluacion.ElementAt(j).NotaObtenida;
                            notasAlumno.Add(notaConsultada);
                            validacion = 1;
                            cuenta++;
                        }
                        j++;
                    }
                    if ((cuenta == 0) && (j == numeroNotas))
                    {
                        notasAlumno.Add(0);
                    }
                    i++;
                }
                return notasAlumno;
            }
            catch (NullReferenceException e)
            {
                return null;
            }
        }

        /// <summary>
        /// Se busca la lista de estudiantes de la seccion
        /// </summary>
        /// <returns>retorna una lista de tipo estudiante</returns>
        public List<Estudiante> ConsultarEstudiantes(int IdSeccion)
        {
            try
            {
                List<Estudiante> consultaEstudiantes = new List<Estudiante>();
                consultaEstudiantes = _sql.ConsultarEstudiantes(IdSeccion);
                return consultaEstudiantes;
            }
            catch (NullReferenceException e)
            {
                return null;
            }
        }

        /// <summary>
        /// Se calcula el promedio de notas de la seccion
        /// </summary>
        /// <returns>retorna un valor decimal</returns>
        public decimal CalcularPromedio(List<decimal> notas)
        {
            decimal promedio = 0;
            int i = 0;
            try
            {
                int numeroRegistros = notas.Count;

                if (!numeroRegistros.Equals(0))
                {

                    while (i < numeroRegistros)
                    {
                        promedio = promedio + notas.ElementAt(i);
                        i++;
                    }
                    promedio = promedio / numeroRegistros;
                    return promedio;
                }
                return 0;
            
            }catch(DivideByZeroException e)
            {
                return 0;

            }catch(NullReferenceException e)
            {
                return 0;
            }
        }

        /// <summary>
        /// Se calcula el promedio de notas de cada alumno segun el porcentaje de cada evaluacion
        /// </summary>
        /// <returns>retorna un decimal</returns>
        public decimal CalcularDefinitivaAlumnos(List<Evaluacion> evaluacion, List<decimal> notaAlumno)
        {
            decimal notaFinal = 0;
            try
            {
                int i = 0;
                int numeroRegistros = evaluacion.Count();
                //Con este ciclo se recorren tanto la lista de evaluaciones como la lista de notas del alumno
                //y se van sumando las notas
                while (i < numeroRegistros)
                {                       
                    notaFinal = notaFinal + (notaAlumno.ElementAt(i) * evaluacion.ElementAt(i).Porcentaje) / 100;
                    i++;
                }
                return notaFinal;
            }
            catch (NullReferenceException e)
            {
                return 0;
            }
        }

        #endregion



    }
}
